home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / util / libs / MMULib.lha / MMULib / Asm_Includes / Macros.asm < prev    next >
Encoding:
Assembly Source File  |  1998-09-13  |  18.9 KB  |  739 lines

  1. ;*************************************************
  2. ;** Makros                                      **
  3. ;** © 1990,93,96,98 THOR-Software inc.          **
  4. ;** Version 1.18 vom 20.03.1998                 **
  5. ;*************************************************
  6.  
  7. ;*********************************
  8. ;** Globale Argumente:          **
  9. ;** Falls das Label             **
  10. ;** SHORTSTACK                  **
  11. ;** definiert ist, wird der     **
  12. ;** Stack nur wordweise aligned **
  13. ;** ansonsten auf LW            **
  14. ;*********************************
  15.  
  16. ;*********************************
  17. ;** Einige Macros zum Setzen    **
  18. ;** der CCR-Flags               **
  19. ;** nach 6502-Manier            **
  20. ;*********************************
  21. sec     Macro           ;C=1
  22.         ori #$01,ccr
  23.         Endm
  24.         
  25. clc     Macro           ;C=0
  26.         andi #$fe,ccr
  27.         Endm
  28.         
  29. sez     Macro           ;Z=1
  30.         ori #$04,ccr
  31.         Endm
  32.         
  33. clz     Macro           ;Z=0
  34.         andi #$fb,ccr
  35.         Endm
  36.         
  37. sen     Macro           ;N=1
  38.         ori #$08,ccr
  39.         Endm
  40.         
  41. cln     Macro           ;N=0
  42.         andi #$f7,ccr
  43.         Endm
  44.  
  45. noz     Macro           ;Z=NOT z
  46.         eor #$04,ccr
  47.         EndM
  48.  
  49. sev     Macro           ;V=1
  50.         ori #$02,ccr
  51.         Endm
  52.         
  53. clv     Macro           ;V=0
  54.         andi #$fd,ccr
  55.         Endm
  56.         
  57. clx     Macro           ;X=0
  58.         andi #$ef,ccr
  59.         Endm
  60.  
  61. sex     Macro           ;X=1
  62.         ori #$10,ccr
  63.         EndM
  64.                         
  65. ;*********************************
  66. ;** Löschen der verwendeten     **
  67. ;** Zählvariablen               **
  68. ;*********************************
  69.         
  70. _sc     set 0           ;unser StackCounter
  71. _rc     set 0           ;Zähler für Registeraufgaben
  72. _re     set 0           ;Ebenenzähler für Register
  73. _fc     set 0           ;Zähler für Schleifen
  74. _fe     set 0           ;Ebenenzähler für Schleifen
  75. _pc     set 0           ;Parameterzähler für C-Prozeduren
  76. _pe     set 0           ;Ebenenzähler für C-Prozeduren
  77. _pm     set 0           ;Zählt entnommene Parameter
  78. _bs     set 0           ;Größe des bss-Segmentes durch static
  79.  
  80. ;*********************************
  81. ;** Einige Makros zur Stackver- **
  82. ;** waltung (für Variablen etc) **
  83. ;*********************************
  84.  
  85.         ifd __G2
  86.  
  87. reserve Macro           ;Platz auf dem Stack reservieren
  88.         iflt \1
  89.                 fail    ;Muß größer Null sein
  90.                 mexit
  91.         endc
  92.         
  93.         ifd SHORTSTACK
  94. _si\<_sc> set (\1+((\1)&1))
  95.         elseif
  96. _si\<_sc> set ((\1+3)&-4)
  97.         endc
  98.         
  99.         ifne \1
  100.                 ifle _si\<_sc>-8
  101.                         subq.l #_si\<_sc>,a7
  102.                 elseif
  103.                         lea -_si\<_sc>(a7),a7
  104.                 endc
  105.         endc
  106. _sc     set _sc+1
  107.         Endm
  108. ;Beispiel:      reserve 100: 100 Bytes Platz sparen, a7 ist Baseregister
  109.         
  110. restore Macro           ;Platz auf dem Stack freigeben
  111.         ifle _sc
  112.                 fail    ;Nest-Fehler
  113.                 mexit   
  114.         endc
  115. _sc     set _sc-1
  116.         ifne _si\<_sc>
  117.                 ifle _si\<_sc>-8
  118.                          addq.l #_si\<_sc>,a7
  119.                 elseif
  120.                         lea _si\<_sc>(a7),a7
  121.                 endc
  122.         endc
  123.         EndM
  124. ;Beispiel:      restore         vorher reservierten Platz freigeben
  125.         
  126. extend Macro            ;Platz auf Speicher um n Bytes erweitern
  127.         ifle _sc
  128.                 fail
  129.                 mexit   ;Nest-Fehler
  130.         endc
  131.         
  132.         ifd SHORTSTACK
  133. _si\<_sc> set (\1+((\1)&1))
  134.         elseif
  135. _si\<_sc> set ((\1+3)&-4)
  136.         endc
  137.         
  138.         ifle _si\<_sc>-8
  139.                 subq.l #_si\<_sc>,a7
  140.         elseif
  141.                 lea -_si\<_sc>(a7),a7
  142.         endc
  143. _sh     set _sc-1
  144. _si\<_sh> set _si\<_sh>+_si\<_sc>
  145.         EndM
  146. ;Beispiel:      extend 50:      50 Bytes zum letzten zusätzlich dazuholen,a7=BasePtr
  147.         
  148. shrink Macro            ;Platz auf Speicher um n Bytes verringern
  149.         ifle _sc
  150.                 fail    ;Nest-Fehler
  151.                 mexit
  152.         endc
  153.         
  154.         ifd SHORTSTACK
  155. _si\<_sc> set (\1+((\1)&1))
  156.         elseif
  157. _si\<_sc> set ((\1+3)&-4)
  158.         endc
  159.         
  160.         ifle _si\<_sc>-8
  161.                 addq.l #_si\<_sc>,a7
  162.         elseif
  163.                 lea _si\<_sc>(a7),a7
  164.         endc
  165. _sh     set _sc-1
  166. _si\<_sh> set _si\<_sh>-_si\<_sc>
  167.         iflt _si\<_sh>
  168.                 fail    ;Range-Fehler
  169.                 mexit
  170.         endc
  171.         EndM
  172. ;Beispiel:      shrink 50:      50 Bytes freigeben
  173.         
  174. _lastget Macro          ;Internes Macro zum Aufaddieren der Stacklängen
  175.         ifne _sh-_sc
  176. _sj     set _sj+_si\<_sh>
  177. _sh     set _sh+1
  178.         _lastget
  179.         endc
  180.         EndM
  181.         
  182. loadbase Macro          ;Basisadresse eines davorliegenden Base-Registers laden
  183.         iflt \1
  184.                 fail    ;Range-Fehler
  185.                 mexit
  186.         endc
  187. _sh     set _sc-\1
  188.         iflt _sh
  189.                 fail    ;Nest-Fehler
  190.                 mexit
  191.         endc
  192.  
  193.         ifc '','\3'
  194. _sj     set 0
  195.         elseif
  196. _sj     set \3
  197.         endc
  198.  
  199.         _lastget
  200.         lea _sj(a7),\2
  201.         EndM
  202. ;Beispiel:      loadbase 2,a6   Basisregister zum Speicherblock von vor zwei reserve-Befehlen zu a6
  203.         
  204. saveregs Macro          ;Register auf Stack sichern
  205. _rc     set _rc+1       ;Anzahlzähler
  206. _re     set _re+1       ;Ebenenzähler
  207. _rn\<_re> set _rc       ;Ebene->Nummer
  208. _ri\<_rc> reg \1
  209.         movem.l \1,-(sp)
  210.         EndM
  211. ;Beispiel:      saveregs d0-d1/a0-a1/a6
  212.         
  213. loadregs Macro          ;Register vom Stack holen
  214.         ifle _re
  215.                 fail    ;Nest-Fehler
  216.                 mexit
  217.         endc
  218. _rt     set _rn\<_re>
  219.         movem.l (sp)+,_ri\<_rt>
  220. _re     set _re-1
  221.         EndM
  222. ;Beispiel:      loadregs
  223.  
  224. ;*********************************
  225. ;** Schleifenbefehle            **
  226. ;*********************************
  227.  
  228. for     Macro           ;Schleifenbeginn
  229. _fc     set _fc+1       ;Anzahlzähler+1
  230. _fe     set _fe+1       ;Ebenenzähler
  231. _fn\<_fe> set _fc       ;Ebene->Nummer
  232.         ifc '','\1'     ;Ohne Parameter
  233.                 bra.\0 ._fi\<_fc>_loop
  234.         elseif
  235.                 move.\0 \1-1,\2 ;Geht nur immediate
  236.         endc
  237. ._fi\<_fc>_do:
  238.         EndM
  239.         
  240. ;Beispiele
  241. ;       for     :Schleifenbegin
  242. ;       for.s   :kurze Schleife
  243. ;       for.l #9,d0     ;9 mal in d0
  244.         
  245. next    Macro           ;Schleifenende
  246.         ifle _fe
  247.                 fail    ;Nest-Fehler
  248.                 mexit
  249.         endc
  250. _ft     set _fn\<_fe>
  251. ._fi\<_ft>_loop:
  252.         ifc '','\1'
  253.                 fail    ;Register fehlt
  254.                 mexit
  255.         endc
  256.         ifc '','\2'
  257. ._fi\<_ft>_cont:
  258.                 dbra \1,._fi\<_ft>_do
  259.         elseif          ;mit Bedingung cont nicht möglich
  260.                 db\1 \2,._fi\<_ft>_do
  261.         endc
  262. ._fi\<_ft>_exit:
  263. _fe     set _fe-1
  264.         EndM
  265.         
  266. ;Beispiele
  267. ;       next d0
  268. ;       next eq,d0      ;Abbrechen,wenn eq
  269.  
  270. break   Macro           ;Schleife beenden
  271.         ifle _fe        
  272.                 fail    ;break nicht im Schleifenrumpf
  273.                 mexit
  274.         endc
  275. _ft     set _fn\<_fe>
  276.         ifc '','\1'     ;ohne Bedingung
  277.                 bra.\0 ._fi\<_ft>_exit
  278.         elseif
  279.                 b\1.\0 ._fi\<_ft>_exit
  280.         endc
  281.         EndM
  282.  
  283. ;Beispiele
  284. ;       break           ;Abbrechen
  285. ;       break.s
  286. ;       break.s eq      ;Abbrechen,wenn gleich
  287.  
  288. cont    Macro           ;zum Next-Teil springen
  289.         ifle _fe        
  290.                 fail    ;cont nicht im Schleifenrumpf
  291.                 mexit
  292.         endc
  293. _ft     set _fn\<_fe>
  294.         ifc '','\1'     ;ohne Bedingung
  295.                 bra.\0 ._fi\<_ft>_cont          ;cont bei next mit Bedingung nicht möglich
  296.         elseif
  297.                 b\1.\0 ._fi\<_ft>_cont          ;cont bei next mit Bedingung nicht möglich
  298.         endc
  299.         EndM
  300.  
  301. reloop  Macro           ;zum Schleifenanfang springen
  302.         ifle _fe        
  303.                 fail    ;cont nicht im Schleifenrumpf
  304.                 mexit
  305.         endc
  306. _ft     set _fn\<_fe>
  307.         ifc '','\1'     ;ohne Bedingung
  308.                 bra.\0 ._fi\<_ft>_do
  309.         elseif
  310.                 b\1.\0 ._fi\<_ft>_do
  311.         endc
  312.         EndM
  313. ;Beispiele
  314. ;       reloop          ;Schleife fortsetzen
  315. ;       reloop.s
  316. ;       reloop.s cc     ;Abbrechen,wenn Carry gelöscht
  317.  
  318. do      Macro           ;Schleife beginnen
  319. _fc     set _fc+1       ;Anzahlzähler+1
  320. _fe     set _fe+1       ;Ebenenzähler
  321. _fn\<_fe> set _fc       ;Ebene->Nummer
  322. ._fi\<_fc>_do:
  323. ._fi\<_fc>_cont:
  324.         EndM
  325. ;Schleifenbeginn
  326.  
  327. repeat  Macro           ;Abweisende Schleife beginnen
  328. _fc     set _fc+1       ;Anzahlzähler+1
  329. _fe     set _fe+1       ;Ebenenzähler
  330. _fn\<_fe> set _fc       ;Ebene->Nummer
  331.         bra.\0 ._fi\<_fc>_loop  ;Zum Schleifenende springen
  332. ._fi\<_fc>_do:
  333. ._fi\<_fc>_cont:
  334.         EndM
  335.         
  336. while   Macro           
  337.         ifle _fe
  338.                 fail    ;Nest-Fehler
  339.                 mexit
  340.         endc
  341. _ft     set _fn\<_fe>
  342. ._fi\<_ft>_loop:
  343.         b\1.\0 ._fi\<_ft>_do
  344. ._fi\<_ft>_exit:
  345. _fe     set _fe-1       
  346.         EndM
  347.  
  348. loop    Macro
  349.         while.\0 ra
  350.         EndM
  351.         
  352. ;Beispiele
  353. ;       do              Wiederhole
  354. ;       ...
  355. ;       while.s eq      solange =0
  356.  
  357. ;       repeat.s
  358. ;       ...
  359. ;       while.s eq      dasselbe, nur wird nicht ausgeführt, falls schon beim Eintritt =0
  360. ;*********************************
  361. ;** String-Befehle              **
  362. ;*********************************
  363.  
  364. smove   Macro
  365.         ifne NARG-2
  366.                 fail    ;nur zwei Parameter
  367.         endc
  368.         
  369. ._sm\@: move.b (\1)+,(\2)+
  370.         bne.s ._sm\@
  371.         EndM    
  372.         
  373. ;Beispiele
  374. ;       smove a0,a1
  375. ;       Kopiert String *a0 -> *a1
  376.  
  377.  
  378. strlen  Macro
  379.         ifne NARG-2
  380.                 fail    ;nur zwei Parameter
  381.                 mexit
  382.         endc
  383.         move.l \1,\2
  384. ._sl\@:
  385.         tst.b (\1)+
  386.         bne.s ._sl\@
  387.         sub.l \1,\2
  388.         not.l \2
  389.         Endm
  390.  
  391. ;Beispiele
  392. ;       strlen a0,d0
  393. ;       Holt Länge des Strings a0 zu d0
  394. ;       a0 zeigt danach auf das Stringende (das NUL-Byte)
  395.  
  396.         
  397. ;*********************************
  398. ;** C-Prozedurbefehle           **
  399. ;*********************************
  400.  
  401. _putarg Macro                                   ;Zum Schreiben eines Argumentes
  402.         ifgt \1
  403. _pm             set 1                           ;Ein Parameter entnommen
  404.  
  405.                 ifnc '','\2'
  406.                                                 ;hier: Parameter vorhanden
  407.                         ifc '.l','\2'
  408. _pm                             set 2           ;mit Angabe: Longword
  409. _pc                             set _pc+4
  410.                         endc
  411.                         ifc '.w','\2'
  412. _pm                             set 2           ;mit Angabe: Word
  413. _pc                             set _pc+2
  414.                         endc
  415.                         ifc '.b','\2'
  416. _pm                             set 2           ;mit Angabe: Byte
  417. _pc                             set _pc+2       ;ja: ein Byte benötigt zwei Bytes (strange, what ?)
  418.                         endc
  419.                         
  420.                         ifeq _pm-2
  421.                                 ifc '\3',''
  422.                                         fail    ;Parameter fehlt
  423.                                         mexit
  424.                                 endc
  425.                                 move\2 \3,-(sp) ;hier mit Angabe
  426.                         elseif  
  427.                                 ifne _fl
  428.                                         move.l \2,-(sp) ;Long
  429. _pc                                     set _pc+4
  430.                                 elseif
  431.                                         move.w \2,-(sp) ;oder hier mit ohne: Word
  432. _pc                                     set _pc+2
  433.                                 endc
  434.                         endc
  435.         
  436.                 endc
  437.         
  438.         
  439. _pe             set \1-_pm
  440.                 ifeq _pm-2
  441.                         _putarg \<_pe>,\4,\5,\6,\7,\8,\9,\A,\B,\C,\D,\E,\F,\G,\H,\I,\J
  442.                 elseif
  443.                         _putarg \<_pe>,\3,\4,\5,\6,\7,\8,\9,\A,\B,\C,\D,\E,\F,\G,\H,\I,\J
  444.                 endc
  445.         
  446.         endc
  447.         endm
  448.         
  449.         
  450. bcr     Macro           ;Aufruf mit bsr
  451. _pc     set 0
  452. _fl     set 0
  453.         _putarg 18,\J,\I,\H,\G,\F,\E,\D,\C,\B,\A,\9,\8,\7,\6,\5,\4,\3,\2
  454.         bsr.\0 \1
  455.         ifne _pc
  456.         lea _pc(a7),a7
  457.         endc
  458.         EndM
  459.  
  460. jcr     Macro           ;Aufruf mit jsr
  461. _pc     set 0
  462. _fl     set 0
  463.         _putarg 18,\J,\I,\H,\G,\F,\E,\D,\C,\B,\A,\9,\8,\7,\6,\5,\4,\3,\2
  464.         jsr \1
  465.         ifne _pc
  466.         lea _pc(a7),a7
  467.         endc
  468.         EndM
  469.  
  470. jtags   Macro           ;Aufruf einer Library mit Tags
  471. _pc     set 4
  472. _fl     set 1
  473.         clr.l -(a7)     ;TAG_END
  474.         _putarg 17,\J,\I,\H,\G,\F,\E,\D,\C,\B,\A,\9,\8,\7,\6,\5,\4,\3
  475.         move.l a7,\2
  476.         jsr \1
  477.         lea _pc(a7),a7
  478.         EndM
  479.  
  480.  
  481. ;Beispiele:
  482. ;jcr Handler,.l,#0,IO(a1)
  483. ;bcr.s TempFree,a1,.l,a5,.l,#0,.b,Execbase,.l
  484. ;
  485. ;Defaultgröße ist Word
  486. ;Alles mit bis zu 18(17) Parametern,eventuell Typenangabe möglich (sonst Überlauf der Macro-Ebenen)
  487. ;Bei tags generell alles long !
  488.  
  489. deftag  Macro           ;Beginn eines Tag-Aufrufes
  490. _pc     set 4
  491.         clr.l -(a7)     ;TAG_END
  492.         EndM
  493.         
  494. tag     Macro
  495.         move.l \2,-(sp)         ;illegale Tagdaten
  496.         move.l #\1,-(sp)        ;illegale Tagdaten
  497. _pc     set _pc+8
  498.         EndM
  499.  
  500. itag    Macro
  501.         move.l \2,-(sp)         ;illegale Tagdaten
  502.         move.l \1,-(sp)         ;illegale Tagdaten
  503. _pc     set _pc+8
  504.         EndM
  505.         
  506. endtag  Macro           ;Ende eines Tag-Aufrufes
  507.         move.l a7,\2
  508.         jsr \1
  509.         lea _pc(a7),a7
  510.         endM
  511.  
  512. ;Beispiele:
  513. ;deftag
  514. ; tag FT+3,Size
  515. ;endtag OpenWindowTagList(a6),a0
  516.  
  517. defarg  Macro           ;Start der Argumentendefinition
  518.         rsreset
  519. _sh     set 0
  520. _sj     set 0
  521.         _lastget
  522.         rs.l 1          ;für PC reserviert
  523.         ifnc '','\1'
  524.         rs.l \1         ;Angabe der # geretteter Register
  525.         endc    
  526.         rs.b _sj        ;Soviel für Variablen etc. reserviert
  527.         EndM
  528.         
  529. arg     Macro           ;Name eines Argumentes bestimmen
  530.         ifc '','\0'
  531. \1              rs.w 1
  532.         elseif
  533. \1              rs.\0 1
  534.                 ifc 'b','\0'
  535.                         rs.b 1
  536.                 endc
  537.         endc
  538.         EndM
  539.         
  540. endarg  Macro
  541.                         ;Dummy-Makro
  542.         EndM    
  543.         
  544. ;Beispiele
  545. ; defarg                Beginn der Argumentendefinition
  546. ;       arg Buffer      Ein Argument, keine Größe => also Word
  547. ;       arg.l Code      Ein LW
  548. ;       arg.w Len       Ein Word
  549. ;       arg.b char      Ein Byte
  550. ; endarg                Ende der Definition
  551.  
  552. ; Noch ein Sonderservice: Unsere=C Arg-Convention ist bis auf aufeinanderfolgende
  553. ; Byte-Variablen kompatibel zur Auto-Variablen Deklaration (s.u.)
  554. ;*********************************
  555. ;** Variablenbefehle            **
  556. ;*********************************
  557. defvar  Macro
  558.         rsreset
  559.         EndM            ;Start der Variablen-Deklaration
  560. auto    Macro
  561.         ifc     '','\2'
  562. \1              rs.\0   1
  563.         elseif
  564. \1              rs.\0   \2
  565.         endc
  566.         EndM            ;Eine Variable auf dem Stack,Array erlaubt
  567.         
  568. static  Macro
  569.         ifc     '','\2'
  570. _bc             set 1
  571.         elseif
  572. _bc             set \2
  573.         endc
  574. _bz     set 0
  575.         ifc     'l','\0'
  576. _bs     set (_bs+1)&$fffffffe
  577. _bz             set 4
  578.         endc
  579.         ifc     'w','\0'
  580. _bs     set (_bs+1)&$fffffffe
  581. _bz             set 2
  582.         endc
  583.         ifc     'b','\0'
  584. _bz             set 1
  585.         endc
  586.         ifeq    _bz
  587.                 fail    ;unbekannte Datengröße
  588.                 mexit
  589.         endc
  590. \1      =_bs
  591. _bs     set     _bs+(_bc*_bz)
  592.         EndM            ;Eine Variable im bss, Array erlaubt
  593.         
  594. extern  Macro
  595.         xref    \1
  596.         EndM            ;Eine externe Variable
  597. register Macro
  598. \1      equr    \2
  599.         EndM            ;Eine Register-Variable
  600. endvar  Macro
  601. ._vl\@  rs.b 0
  602.         reserve ._vl\@
  603.         EndM            ;Ende einer Variablenliste
  604.         
  605. freevar Macro           ;Variablen freigeben
  606.         restore
  607.         EndM
  608. staticspace Macro
  609.         ds.b _bs        ;Platz für static reservieren
  610.         EndM
  611.         
  612. ; defvar                Ein Beispiel:
  613. ;       auto.w   count  eine Wordvariable
  614. ;       auto.l   help,4 ein LongWord-Array (4 Stück)
  615. ;       auto.b   char   eine Byte-Variable
  616. ;       auto.l   inc    eine longword-Variable
  617. ;       static.l save   eine statische Variable (alles global)
  618. ;       register.w cinc,d0      eine Register-Variable (alles global)
  619. ; endvar
  620. ; restore=freevar vor Verlassen des Unterprogrammes zum Wiederherstellen des SP nicht vergessen !
  621. ; (Nur wenn auto-Variablen vorhanden)
  622.  
  623.         endc
  624.  
  625. ;*********************************
  626. ;** Langwort-Bit-Befehle        **
  627. ;** für d(an) Adressiermodus    **
  628. ;** und Absolut,d(an,dn)        **
  629. ;*********************************                      
  630. btstm   Macro
  631.         btst #(\1)&$7,(3^((\1)>>3))+\2
  632.         Endm
  633.         
  634. bclrm   Macro
  635.         bclr #(\1)&$7,(3^((\1)>>3))+\2
  636.         Endm    
  637.         
  638. bsetm   Macro
  639.         bset #(\1)&$7,(3^((\1)>>3))+\2
  640.         Endm    
  641.         
  642. bchgm   Macro
  643.         bchg #(\1)&$7,(3^((\1)>>3))+\2
  644.         Endm
  645.  
  646.         ;Umkehrung zu btstm
  647.                 
  648. bnegm   Macro
  649.         btst #(\1)&$7,(3^((\1)>>3))+\2
  650.         noz
  651.         Endm    
  652.         
  653. ;Beispiel: btstm 21,10(a5)      ;Bit 21 im LW 10(a5) testen
  654.  
  655.  
  656. ;*************************************************
  657. ;** Listenverarbeitungsmakros                   **
  658. ;*************************************************
  659.  
  660. ;Liste vorbereiten: Argument ist Ptr
  661. NewList         Macro
  662.         move.l \1,8(\1)
  663.         addq.l #4,\1
  664.         clr.l (\1)
  665.         move.l \1,-(\1)
  666.         endm
  667.  
  668. ;*a1 an Liste *a0 anhängen      (Aufruf wie Exec-Routine)
  669. AddHead         Macro
  670.         MOVE.L  (A0),D0
  671.         MOVE.L  A1,(A0)
  672.         MOVEM.L D0/A0,(A1)
  673.         MOVE.L  D0,A0
  674.         MOVE.L  A1,4(A0)
  675.         ENDM
  676.  
  677. ;*a1 an Liste *a0 anhängen      (Aufruf wie Exec-Routine)
  678. AddTail         Macro
  679.         ADDQ.L  #4,A0
  680.         MOVE.L  4(A0),D0
  681.         MOVE.L  A1,4(A0)
  682.         EXG     D0,A0
  683.         MOVEM.L D0/A0,(A1)
  684.         MOVE.L  A1,(A0)
  685.         ENDM
  686.  
  687. ;*a1 entfernen                  (Aufruf wie Exec-Routine)
  688. Remove          Macro
  689.         MOVE.L  (A1)+,A0
  690.         MOVE.L  (A1),A1
  691.         MOVE.L  A0,(A1)
  692.         MOVE.L  A1,4(A0)
  693.         ENDM
  694.  
  695. ;Entferne eine Node von *a0     (Aufruf wie Exec-Routine)
  696. RemHead         Macro
  697.         MOVE.L  (A0),A1
  698.         MOVE.L  (A1),D0
  699.         BEQ.S   .__remhead\@
  700.         MOVE.L  D0,(A0)
  701.         EXG.L   D0,A1
  702.         MOVE.L  A0,4(A1)
  703. .__remhead\@:
  704.         ENDM
  705.  
  706.  
  707. ;Entferne eine Node von *a0     (Aufruf wie Exec-Routine)
  708. RemTail         Macro
  709.         MOVE.L  8(A0),A1
  710.         MOVE.L  4(A1),D0
  711.         BEQ.S   .__remtail\@
  712.         MOVE.L  D0,8(A0)
  713.         EXG.L   D0,A1
  714.         MOVE.L  A0,(A1)
  715.         ADDQ.L  #4,(A1)
  716. .__remtail\@:
  717.         ENDM
  718.  
  719.  
  720. ;InsertAfter:   Node *a1 hinter Node *a0 einhängen. (Keine Spezialfälle)
  721. InsertAfter     Macro
  722.         move.l (a0),d0
  723.         movem.l d0/a0,(a1)
  724.         move.l a1,(a0)
  725.         move.l d0,a0
  726.         move.l a1,4(a0)
  727.         EndM
  728.  
  729. ;InsertBefore   Node *a1 vor Node *a0 einhängen. (Keine Spezialfälle)
  730. InsertBefore    Macro
  731.         move.l 4(a0),d0
  732.         move.l a1,4(a0)
  733.         exg.l a0,d0
  734.         movem.l d0/a0,(a1)
  735.         move.l a1,(a0)
  736.         EndM
  737.  
  738.         
  739.